我們上一篇把基本的Reverse題目講完了,接下來要講Stack buffer overflow的部分,但在進入之前,要先來說明應對Stack buffer overflow的攻擊保護,除了接下來的題目會出現以外,就算是有沒出現的之後遇到也可以看這些保護的機制,讓繞過保護有一個思考的方向。
先介紹檢查保護的工具checksec,apt就可以下載了。
而它檢查保護機制也很簡單,checksec後加上--file選項後就可以看保護了(不過直接打檔名也可以)。
說真的,相較起以前,現在的保護越來越多了,以後的Pwn只會越來越難打QQ…
ASLR (Address space layout randomization)
先來說ASLR,它會讓每一次程式啟動時Address都會不一樣,我們之前做的題型都可以很明確的知道我們要覆蓋的Return address是什麼值,就精準的覆蓋掉,讓RIP轉跳過去,但開啟了ASLR後如果要知道該轉跳到哪裡,就必須要做Information leak,leak出特定的Address,並推算出相對位置或是利用系統中固定不變的Address來計算出我們想要跳轉的目標位置等繞過手法。
RELRO (RELocation Read Only)
這個是為了防止GOT被修改,把GOT設定成只能讀不能寫的權限,程式在運作時,會利用動態鏈接來減少程式啟動的負擔和提高效率,而動態鏈接會先轉跳到PLT然後再轉跳到GOT,因此,如果可以覆蓋掉GOT,那PLT再跳到GOT時就會執行我們覆蓋掉的程式碼了。
這個時候可能就需要透過ROP、找到未被保護的GOT或是利用格式化字串漏洞等方式來繞過這個保護。
NX (No eXecute bit)
NX在Windows又被稱為DEP(Data Execution Prevention),簡單來說就是讓可以寫的不能夠被執行,而可以被執行的就不能夠被寫入,那繞過就是想辦法把可寫可執行的權限加入進去,比如透過mmap或是mprotect等方式。
PIE (Position independent executable)
PIE和ASLR很像,差異在於PIE是讓程式碼和記憶體的Address隨機化,而ASLR是將text、data、bss、heap、stack以及.so檔案等,在程式開始的位置加上一段隨機長度的空間,這些動作主要是為了防止ROP攻擊。
Canary
Canary就是在Old rbp之前加入一個Random值,如果這個Random值被修改了,那就會觸發Stack smashing Detected 程式會直接結束。
可以在Runtime時將Canary的值Leak出來,這樣在構造payload的時候就可以把Canary的值放在該有的位置上,或是程式是非線性的寫入,可以讓使用者從特定的地方開始寫,那就可能可以跳過Canary的保護,直接寫在Return address上。
除了上述的這些保護機制以外還有很多沒介紹到的保護機制,畢竟保護的機制只會越來越多,而這些也都有對應的繞過方式,但如果同時使用了好幾種保護機制,那入侵的難度會指數型成長。